package org.jeecg.modules.wms.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.wms.entity.WmsPurchaseOrder;
import org.jeecg.modules.wms.vo.WmsPurchaseOrderVO;

import java.util.List;
import java.util.Map;

/**
 * @Description: 采购单主表Service接口
 * @Author: jeecg-boot
 * @Date: 2023-07-17
 * @Version: V1.0
 */
public interface IWmsPurchaseOrderService extends IService<WmsPurchaseOrder> {

    /**
     * 分页查询采购单列表
     *
     * @param page       分页参数
     * @param queryParam 查询参数
     * @return 分页结果
     */
    IPage<WmsPurchaseOrder> queryPurchaseOrderPageList(Page<WmsPurchaseOrder> page, Map<String, Object> queryParam);

    /**
     * 根据ID查询采购单信息
     *
     * @param id 采购单ID
     * @return 采购单信息
     */
    WmsPurchaseOrderVO getPurchaseOrderById(String id);

    /**
     * 新增采购单
     *
     * @param purchaseOrderVO 采购单信息
     * @return 操作结果
     */
    Result<?> savePurchaseOrder(WmsPurchaseOrderVO purchaseOrderVO);

    /**
     * 编辑采购单
     *
     * @param purchaseOrderVO 采购单信息
     * @return 操作结果
     */
    Result<?> updatePurchaseOrder(WmsPurchaseOrderVO purchaseOrderVO);

    /**
     * 删除采购单
     *
     * @param id 采购单ID
     * @return 操作结果
     */
    Result<?> deletePurchaseOrder(String id);

    /**
     * 批量删除采购单
     *
     * @param ids ID列表
     * @return 操作结果
     */
    Result<?> batchDeletePurchaseOrder(List<String> ids);

    /**
     * 提交采购单审批
     *
     * @param id 采购单ID
     * @return 操作结果
     */
    Result<?> submitPurchaseOrder(String id);

    /**
     * 审批采购单
     *
     * @param id      采购单ID
     * @param approve 是否通过
     * @param remark  审批意见
     * @return 操作结果
     */
    Result<?> approvePurchaseOrder(String id, Boolean approve, String remark);

    /**
     * 取消采购单
     *
     * @param id 采购单ID
     * @return 操作结果
     */
    Result<?> cancelPurchaseOrder(String id);

    /**
     * 自动生成采购单
     *
     * @param warningIds 物料预警ID列表
     * @return 操作结果
     */
    Result<?> autoGeneratePurchaseOrder(List<String> warningIds);

    /**
     * 更新采购单状态
     *
     * @param id     采购单ID
     * @param status 状态
     * @return 更新结果
     */
    boolean updatePurchaseOrderStatus(String id, Integer status);

    /**
     *  保存成功后，检查采购单是否全部到货
     */
    void updatePurchaseOrderStatus(String id);

    /**
     * 更新采购单总金额
     *
     * @param id 采购单ID
     * @return 更新结果
     */
    boolean updatePurchaseOrderTotalAmount(String id);
    
    /**
     * 保存采购单（controller调用）
     * 
     * @param purchaseOrderVO 采购单信息
     * @return 操作结果
     */
    Result<?> saveOrder(WmsPurchaseOrderVO purchaseOrderVO);
    
    /**
     * 更新采购单（controller调用）
     * 
     * @param purchaseOrderVO 采购单信息
     * @return 操作结果
     */
    Result<?> updateOrder(WmsPurchaseOrderVO purchaseOrderVO);
    
    /**
     * 删除采购单（controller调用）
     * 
     * @param id 采购单ID
     * @return 操作结果
     */
    Result<?> deleteOrder(String id);
    
    /**
     * 批量删除采购单（controller调用）
     * 
     * @param ids ID列表
     * @return 操作结果
     */
    Result<?> deleteOrders(List<String> ids);
    
    /**
     * 提交采购单审批（controller调用）
     * 
     * @param id 采购单ID
     * @return 操作结果
     */
    Result<?> submitOrder(String id);
    
    /**
     * 审批采购单（controller调用）
     * 
     * @param id 采购单ID
     * @param approveStatus 审批状态
     * @param remark 审批意见
     * @param params 其他参数，包含审核人信息
     * @return 操作结果
     */
    Result<?> approveOrder(String id, Integer approveStatus, String remark, Map<String, Object> params);
    
    /**
     * 取消采购单（controller调用）
     * 
     * @param id 采购单ID
     * @return 操作结果
     */
    Result<?> cancelOrder(String id);
    
    /**
     * 从物料预警生成采购单
     *
     * @param warningIds 预警ID列表
     * @param supplier 供应商
     * @return 操作结果
     */
    Result<?> generatePurchaseOrderFromWarnings(List<String> warningIds, String supplier);

    /**
     * 保存采购到货信息（包含不合格物料）
     *
     * @param purchaseOrderId 采购单ID
     * @param arrivalDate 到货日期
     * @param details 到货明细
     * @param unqualifiedList 不合格物料列表
     * @param username 操作用户
     * @return 处理结果
     */
    Result<?> saveArrivalInfo(String purchaseOrderId, String arrivalDate, List<Map<String, Object>> details, List<Map<String, Object>> unqualifiedList, String username);
} 